const { ERROR } = require("./error");

function getHttpClientInfo() {
  const requestId = this.getUniCloudRequestId();
  const {
    clientIP,
    userAgent,
    source,
    secretType = "none",
  } = this.getClientInfo();
  const { clientInfo = {} } = JSON.parse(this.getHttpInfo().body);

  return {
    ...clientInfo,
    clientIP,
    userAgent,
    source,
    secretType,
    requestId,
  };
}

function getHttpUniIdToken() {
  const { uniIdToken = "" } = JSON.parse(this.getHttpInfo().body);

  return uniIdToken;
}

function verifyHttpMethod() {
  const { headers, httpMethod } = this.getHttpInfo();

  if (
    !/^application\/json/.test(headers["content-type"]) ||
    httpMethod.toUpperCase() !== "POST"
  ) {
    throw {
      errCode: ERROR.UNSUPPORTED_REQUEST,
      errMsg: "unsupported request",
    };
  }
}

function universal() {
  if (this.getClientInfo().source === "http") {
    verifyHttpMethod.call(this);
    this.getParams()[0] = JSON.parse(this.getHttpInfo().body).params;
    this.getUniversalClientInfo = getHttpClientInfo.bind(this);
    this.getUniversalUniIdToken = getHttpUniIdToken.bind(this);
  } else {
    this.getUniversalClientInfo = this.getClientInfo;
    this.getUniversalUniIdToken = this.getUniIdToken;
  }
}

module.exports = universal;
